//+------------------------------------------------------------------+ //| Williama PriceTrapper.mq4 | //| Based on the great strategie of Williama | //| Coded by Naufrage, All rights granted to you :) | //| | //+------------------------------------------------------------------+ #property copyright "Coded by Raphy, All rights granted to you :)" #property link "" //---- input parameters extern int pips=15; // number of pips between each level extern double lots=0.01; extern int NbLevels=3; // Number of levels of the pending orders (for each target, buy and sell) extern int ProfitTarget=0; //Minimum profit target, in pips. Whatever happen, at least this profit is made (unless we run out of free margin...). int Magic=17663; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int ticket, cpt, profit, total, BuyGoalProfit, SellGoalProfit; double BuyGoal=0, SellGoal=0, spread=(Ask-Bid)/Point; //---- total=OrdersTotal(); if(total<1) //we can set up a new "price catcher" { if(AccountFreeMargin()<(10000*lots)) { Print("Not enough free margin to begin"); return(0); } SellGoal=Ask-(NbLevels+1)*pips*Point; BuyGoal=Ask+(NbLevels+1)*pips*Point; for(cpt=1;cpt<=NbLevels;cpt++) { ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,Ask+cpt*pips*Point,2,SellGoal,BuyGoal,"InitialSetup",Magic,0,Green); if(ticket==0) { Print("Error opening BUYSTOP order : ",GetLastError()); return(0); } ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,Bid-cpt*pips*Point,2,BuyGoal+spread*Point,SellGoal-spread*Point,"InitialSetup",Magic,0,Green); if(ticket==0) { Print("Error opening SELLSTOP order : ",GetLastError()); return(0); } } } // initial setup done else { OrderSelect(0, SELECT_BY_POS, MODE_TRADES); cpt=0; while(OrderType()!=OP_BUY && OrderType()!=OP_BUYSTOP) { OrderSelect(cpt, SELECT_BY_POS, MODE_TRADES); cpt++; } BuyGoal=OrderTakeProfit(); SellGoal=OrderStopLoss(); // check if pending orders must be canceled if(Ask>=BuyGoal || (Ask<=SellGoal)) { for(cpt=0;cpt=SellGoal) // now we check if profit will be made no matter which goal is reached, and add pending orders if necessary { //first, check profit if the BuyGoal is reached profit=0; for(cpt=0;cptAsk) profit+=(BuyGoal-OrderOpenPrice())/Point; } } cpt=1; BuyGoalProfit=profit; while(profitNbLevels) cpt=1; } // then, check profit if SellGoal is reached profit=0; for(cpt=0;cpt(SellGoal+cpt*pips*Point)) { ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,(SellGoal-spread*Point)+cpt*pips*Point,2,BuyGoal+spread*Point,SellGoal-spread*Point,"",Magic,0,Green); if(ticket==0) { Print("Error opening SELLSTOP order : ",GetLastError()); return(0); } profit+=cpt*pips; } cpt++; if(cpt>NbLevels) cpt=1; } } } string sComment = ""; string sep = "----------------------------------------\n"; string nl = "\n"; sComment = "Williama EA v.0.1" + nl; sComment = sComment + "Lots=" + DoubleToStr(lots,2) + nl; sComment = sComment + "Buy Goal= " + DoubleToStr(BuyGoal,4) + nl; sComment = sComment + "Buy Goal Profit (in pips)=" + BuyGoalProfit + nl + nl; sComment = sComment + "Sell Goal= " + DoubleToStr(SellGoal,4) + nl; sComment = sComment + "Sell Goal Profit (in pips)=" + SellGoalProfit + nl + nl; sComment = sComment + "Pips of each level=" + pips + nl; sComment = sComment + "Number of levels for each goal: " + NbLevels + nl; sComment = sComment + "Spread= " + DoubleToStr(spread,1) + nl; sComment = sComment + sep; Comment(sComment); //---- return(0); } //+------------------------------------------------------------------+